<?php

namespace Sharks\Core\Cfg;

use Noodlehaus\Config;
use Sharks\Core\Support\Base\Files;
use Sharks\Core\Support\Base\Precondition;
use Sharks\Core\Support\Bag\ConfigBag;

/**
 * 配置
 */
class Configuration {

    private $cfg;

    /**
     * 从文件中初始化, 支持yml,xml,json等,请参考 Noodlehaus\Config
     * @param  string $file 文件路径
     */
    public function __construct($file) {
        // 检查配置文件是否存在
        Precondition::check(file_exists($file), "未找到配置文件 $file");
        $this->cfg = Config::load($file);
    }
    
    /**
     * 获得配置项
     * @param  string $name    配置项名称
     * @param  mixed $default  默认值
     * @return mixed
     */
    public function get($name, $default = null) {
        return $this->cfg->get($name, $default);
    }
    
    /**
     * 返回数组
     * @return array 配置的所有数据
     */
    public function all() {
        return $this->cfg->all();
    }

    /**
     * 合并另一配置。注意覆盖规则，参考 ConfigBag
     * @param  array|Configuration $cfg 另一配置对象
     */
    public function merge($cfg) {
        if (is_array($cfg)) {
            $this->_merge($cfg);
        }
        elseif (is_a($cfg, Configuration::class)) {
            $this->_merge($cfg->all());
        }
    }

    protected function _merge(array $cfg) {
        foreach ($cfg as $key => $value) {
            $this->cfg->set($key, $value);
        }
    }

}